Make DryRunnable wrap Agent instead of extending an Agent instance

This allows DryRunnable to work with other concerns that override the
behavior of create_event(), such as SortableEvents.

Akinori MUSHA 9 years ago
parent
commit
93e6c655ad
1 changed files with 21 additions and 11 deletions
  1. 21 11
      app/concerns/dry_runnable.rb

+ 21 - 11
app/concerns/dry_runnable.rb

@@ -1,10 +1,8 @@
1 1
 module DryRunnable
2
-  def dry_run!
3
-    readonly!
2
+  extend ActiveSupport::Concern
4 3
 
5
-    class << self
6
-      prepend Sandbox
7
-    end
4
+  def dry_run!
5
+    @dry_run = true
8 6
 
9 7
     log = StringIO.new
10 8
     @dry_run_logger = Logger.new(log)
@@ -14,6 +12,7 @@ module DryRunnable
14 12
 
15 13
     begin
16 14
       raise "#{short_type} does not support dry-run" unless can_dry_run?
15
+      readonly!
17 16
       check
18 17
     rescue => e
19 18
       error "Exception during dry-run. #{e.message}: #{e.backtrace.join("\n")}"
@@ -23,28 +22,38 @@ module DryRunnable
23 22
       memory: memory,
24 23
       log: log.string,
25 24
     )
25
+  ensure
26
+    @dry_run = false
26 27
   end
27 28
 
28 29
   def dry_run?
29
-    is_a? Sandbox
30
+    !!@dry_run
31
+  end
32
+
33
+  included do
34
+    prepend Wrapper
30 35
   end
31 36
 
32
-  module Sandbox
37
+  module Wrapper
33 38
     attr_accessor :results
34 39
 
35 40
     def logger
41
+      return super unless dry_run?
36 42
       @dry_run_logger
37 43
     end
38 44
 
39
-    def save
40
-      valid?
45
+    def save(options = {})
46
+      return super unless dry_run?
47
+      perform_validations(options)
41 48
     end
42 49
 
43
-    def save!
44
-      save or raise ActiveRecord::RecordNotSaved
50
+    def save!(options = {})
51
+      return super unless dry_run?
52
+      save(options) or raise_record_invalid
45 53
     end
46 54
 
47 55
     def log(message, options = {})
56
+      return super unless dry_run?
48 57
       case options[:level] || 3
49 58
       when 0..2
50 59
         sev = Logger::DEBUG
@@ -58,6 +67,7 @@ module DryRunnable
58 67
     end
59 68
 
60 69
     def create_event(event)
70
+      return super unless dry_run?
61 71
       if can_create_events?
62 72
         event = build_event(event)
63 73
         @dry_run_results[:events] << event.payload